generate k means, m1, ..., mk, using a random number generator;
while the change is not insignificant
Assignment step:
for each cluster i,
Si = {xp | ∥xp - mi∥2 < ∥xp - mj∥2 ∀j, j ≠ i and 1 ≤ j ≤ k};
Update step:
for each cluster i,
mi = (1 / |Si|) Σj(xj ∈ Si); // Note xj is a vector.
draw().